import os
import json
import logging
from typing import Dict, Any, Optional

# 配置日志
logger = logging.getLogger(__name__)

class ConfigManager:
    """配置管理类，用于加载和管理配置文件"""
    
    def __init__(self, config_dir=None, env=None):
        """
        初始化配置管理器
        
        Args:
            config_dir: 配置文件目录路径，默认为项目根目录下的config目录
            env: 当前环境，默认为从环境变量或配置中获取
        """
        self.config_dir = config_dir or os.path.join(os.path.dirname(os.path.dirname(__file__)), 'config')
        self.config_cache = {}
        # 设置当前环境
        self.env = env or os.environ.get('FLASK_ENV', 'development')
    
    def load_config(self, config_file):
        """
        加载配置文件
        
        Args:
            config_file: 配置文件名，如'db.json', 'oss.json'
            
        Returns:
            dict: 配置数据
            
        Raises:
            FileNotFoundError: 配置文件不存在
            json.JSONDecodeError: 配置文件格式不正确
        """
        # 检查缓存
        if config_file in self.config_cache:
            return self.config_cache[config_file]
        
        # 构建配置文件路径
        config_path = os.path.join(self.config_dir, config_file)
        
        # 检查文件是否存在
        if not os.path.exists(config_path):
            logger.error(f"配置文件不存在: {config_path}")
            raise FileNotFoundError(f"配置文件不存在: {config_path}")
        
        try:
            # 读取配置文件
            with open(config_path, 'r', encoding='utf-8') as f:
                config_data = json.load(f)
                
            # 缓存配置
            self.config_cache[config_file] = config_data
            logger.info(f"配置文件加载成功: {config_file}")
            return config_data
        except json.JSONDecodeError as e:
            logger.error(f"配置文件格式不正确: {config_file}, 错误: {str(e)}")
            raise
        except Exception as e:
            logger.error(f"配置文件加载失败: {config_file}, 错误: {str(e)}")
            raise
    
    def get_db_config(self, db_name=None):
        """获取数据库配置
        
        Args:
            db_name: 指定数据库名称，默认为freefishchn
        
        Returns:
            dict: 数据库配置
        """
        config_data = self.load_config('db.json')
        target_db = db_name or 'freefishchn'
        
        # 检查是否有指定数据库的配置
        if target_db in config_data:
            db_config = config_data[target_db]
            # 转换字段名以保持向后兼容性
            # 将username转换为user（如果存在username但不存在user）
            if 'username' in db_config and 'user' not in db_config:
                db_config['user'] = db_config['username']
            return db_config
        else:
            logger.warning(f"未找到数据库 '{target_db}' 的配置，使用默认数据库freefishchn")
            # 如果指定的数据库不存在，返回freefishchn配置（如果存在）
            if 'freefishchn' in config_data:
                db_config = config_data['freefishchn']
                # 转换字段名以保持向后兼容性
                if 'username' in db_config and 'user' not in db_config:
                    db_config['user'] = db_config['username']
                return db_config
            else:
                # 如果连freefishchn都不存在，返回整个配置（兼容旧格式）
                return config_data
    
    def get_oss_config(self):
        """获取OSS配置
    
        Returns:
            dict: OSS配置
        """
        config_data = self.load_config('oss.json')
        
        # 直接返回配置数据，不区分新旧格式
        logger.info("使用OSS配置")
        return config_data
    
    def set_env(self, env):
        """设置当前环境
        
        Args:
            env: 环境名称，如 'development', 'production', 'test'
        """
        self.env = env
        # 清除缓存，以便重新加载对应环境的配置
        self.clear_cache()
        logger.info(f"当前环境已设置为: {env}")
    
    def get_env(self):
        """获取当前环境
        
        Returns:
            str: 当前环境名称
        """
        return self.env
    
    def update_config(self, config_file, config_data):
        """
        更新配置文件
        
        Args:
            config_file: 配置文件名
            config_data: 新的配置数据
        """
        config_path = os.path.join(self.config_dir, config_file)
        
        try:
            with open(config_path, 'w', encoding='utf-8') as f:
                json.dump(config_data, f, ensure_ascii=False, indent=2)
            
            # 更新缓存
            self.config_cache[config_file] = config_data
            logger.info(f"配置文件更新成功: {config_file}")
        except Exception as e:
            logger.error(f"配置文件更新失败: {config_file}, 错误: {str(e)}")
            raise
    
    def clear_cache(self):
        """清除配置缓存"""
        self.config_cache.clear()
        logger.info("配置缓存已清除")

# 创建全局配置管理器实例
global_config = ConfigManager()

# 方便导入的快捷函数
def get_db_config(db_name=None):
    """获取数据库配置的快捷函数
    
    Args:
        db_name: 指定数据库名称，默认为freefishchn
        
    Returns:
        dict: 数据库配置
    """
    return global_config.get_db_config(db_name)

def get_oss_config():
    """获取OSS配置的快捷函数

    Returns:
        dict: OSS配置
    """
    return global_config.get_oss_config()

def set_config_env(env):
    """设置配置环境的快捷函数
    
    Args:
        env: 环境名称
    """
    global_config.set_env(env)

def get_config_env():
    """获取当前配置环境的快捷函数
    
    Returns:
        str: 当前环境名称
    """
    return global_config.get_env()